package com.levi.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.support.AmqpHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 消费者消费消息过程中出现异常了，会把出现异常的消息打入死信队列
 * 该消费者专门用于消费死信队列里面的消息
 */
@Component
public class DeadQueueConsumer {

    @RabbitListener(queues = {"dead"})
    public void connsumerMsg(String msg,
                             Channel channel,
                             CorrelationData correlationData,
                             @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {

        try {
            //对消息进行消费,简单打印出来表示已经消费过
            System.out.println("死信队列中的消息是: "+msg);

            /**
             * 第一个参数:消息的tag
             * 第二个参数:是否应用于多消息
             * 第三个参数:是否重新放回队列，否则丢弃或者进入死信队列
             */
        } catch (Exception e) {
            //如果还是消费出现异常了，那么就需要人工干预
            //例如，发一条短信，或者让该消息进入数据库，再根据业务需求进行人工处理
            //最后把这条消息给移除掉
            channel.basicNack(tag,false,false);
        }
    }
}
